package com.jxm.utils;


import org.apache.commons.lang3.StringUtils;

public enum MarkUtil {
    INSTANCE;
    public static final String SENSITIVEINFORMATION_HIDDENSTR = "*";

    /**
     * 用户名模糊化，个人姓名保留第1位，企业名保留前2后2
     *
     * @param debtor 用户名
     * @return 模糊化后的用户名
     */
    public String maskDebtor(String debtor) {
        if (debtor == null || "".equals(debtor)) {
            return debtor;
        }
        if (debtor.length() > 4) {
            // 企业名
            return mask(debtor, 2, 2, SENSITIVEINFORMATION_HIDDENSTR);
        } else {
            // 个人姓名
            if (debtor.length() > 2) {
                return mask(debtor, 1, 1, SENSITIVEINFORMATION_HIDDENSTR);
            } else {
                return mask(debtor, 1, 0, SENSITIVEINFORMATION_HIDDENSTR);
            }
        }
    }

    /**
     * 手机号模糊化，保留前3后4
     *
     * @param mobile 手机号码
     * @return 模糊化后的手机号码
     */
    public String maskMobile(String mobile) {
        if (mobile == null || "".equals(mobile)) {
            return mobile;
        }
        return mask(mobile, 3, 4, SENSITIVEINFORMATION_HIDDENSTR);
    }

    /**
     * 邮箱模糊化，邮箱只显示第一个字符和'@'之后的字符，第一个字符之后’@‘之前的，显示为‘****’
     *
     * @param email 邮箱
     * @return 模糊化后的邮箱
     */
    public String maskEmail(String email) {
        if (email == null || "".equals(email)) {
            return email;
        }
        return email.replaceAll("(^\\w)[^@]*(@.*$)", "$1****$2");
    }


    /**
     * [固定电话] 后四位，其他隐藏<例子：****1234>
     *
     * @param fixedPhone
     * @return
     */
    public String markFixedPhone(String fixedPhone) {
        if (fixedPhone == null || "".equals(fixedPhone)) {
            return fixedPhone;
        }
        return StringUtils.leftPad(StringUtils.right(fixedPhone, 4), StringUtils.length(fixedPhone), "*");
    }

    /**
     * [地址] 只显示到地区，不显示详细地址；我们要对个人信息增强保护<例子：北京市海淀区****>
     *
     * @param address
     * @param sensitiveSize 敏感信息长度
     * @return
     */
    public String markAddress(String address, int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    }

    /**
     * 身份证号模糊化，保留前3后4
     *
     * @param idCard 身份证号
     * @return 模糊化后的身份证号
     */
    public String maskIdCard(String idCard) {
        if (idCard == null || "".equals(idCard)) {
            return idCard;
        }
        return mask(idCard, 3, 4, SENSITIVEINFORMATION_HIDDENSTR);
    }

    /**
     * 企业注册号模糊化，保留前3后3
     *
     * @param companyCode 企业注册号
     * @return 模糊化后的身份证号
     */
    public String maskCompanyCode(String companyCode) {
        if (companyCode == null || "".equals(companyCode)) {
            return companyCode;
        }
        return mask(companyCode, 3, 4, SENSITIVEINFORMATION_HIDDENSTR);
    }

    /**
     * 模糊化银行卡号，只保留显示后四位
     * @param bankCardNo
     * @return
     */
    public String maskBankCardNo(String bankCardNo) {
        if (bankCardNo == null || "".equals(bankCardNo)) {
            return bankCardNo;
        }
        return mask(bankCardNo, 0, 4, SENSITIVEINFORMATION_HIDDENSTR);
    }

    /**
     * 模糊化姓名只保留显示一位
     * @param debtor
     * @return
     */
    public String maskDebtorExceptFirst(String debtor) {
        if (debtor == null || "".equals(debtor)) {
            return debtor;
        }
        if (debtor.length() > 4) {
            // 企业名
            return mask(debtor, 2, 2, SENSITIVEINFORMATION_HIDDENSTR);
        } else {
            // 个人姓名
            return mask(debtor, 1, 0, SENSITIVEINFORMATION_HIDDENSTR);
        }
    }

    /**
     * 敏感信息模糊化，将源字符串中指定位置的字符进行替换，模糊化前后字符串长度保持不变
     *
     * @param source        需要处理的源字符串
     * @param startDigit    从字符串开始保留的位数
     * @param backwardDigit 倒数保留的位数
     * @param hiddenStr
     * @return
     */
    public String mask(String source, int startDigit, int backwardDigit, String hiddenStr) {

        if (source == null || (source.length() < (startDigit + backwardDigit))) {
            return source;
        }
        StringBuilder result = new StringBuilder(source.length());
        char[] chars = source.toCharArray();
        for (int i = 0; i < source.length(); i++) {
            if (i < startDigit) {
                result.append(chars[i]);
            } else if (i >= (chars.length - backwardDigit)) {
                result.append(chars[i]);
            } else {
                result.append(hiddenStr);
            }
        }
        return result.toString();
    }
}